package com.ce.pms.customer.service;

import java.util.List;

import com.ce.pms.base.service.IPmsBaseService;
import com.ce.pms.common.model.SysrefcodeDO;
import com.ce.pms.customer.model.IndividualDO;
import com.ce.pms.customer.vo.CustSearchVO;
import com.ce.pms.customer.vo.CustomerHouseVO;
import com.ce.pms.customer.vo.CustomerVO;
import com.ce.pms.customer.vo.IndividualVO;
import com.ce.pms.customer.vo.InterestVO;
import com.ce.pms.customer.vo.MemberVO;
import com.ce.pms.customer.vo.MoveVO;
import com.ce.pms.customer.vo.OrganizationVO;
import com.ce.pms.house.vo.HouseVO;
import com.sitechasia.webx.core.support.Page;

/**
* 功能描述:
* <p>版权所有：中企动力
* <p>未经本公司许可，不得以任何方式复制或使用本程序任何部分
*
* @author  付湘辉
* @Created on  2008-05-22
*/
public interface ICustomerService extends IPmsBaseService {
	/**
	 * 方法描述: 根据客户和房屋删除家庭成员，在此公开是为了日志拦截
	 * @author 胡煦
	 * Create on:2008-6-4
	 * @param participantId：参与人ID
	 * @param houseId：房屋ID
	 * @return
	 * Edit author:
	 * Edit on:
	 * 修改原因：
	 */
	public Long deleteMemberRelation(Long participantId,Long houseId);
	/**
	 *
	 * 功能描述: 添加一个住户（包括业主和租户），在业务上，一个业主可以有多个住房，<br>
	 * 因此添加动作包括添加其住房信息和自身详细资料，对租户来说亦是如此，<br>
	 * 而一个业主或租户可以是一个个人或组织，组织类型的业主(租户)包含有一些个人信息，<br>
	 * 法人和委托人，在添加住户时，应同时添加这些信息及它们的关系信息。<br>
	 * 注意：此方法应被其子类重写以实现不同业务逻辑
	 *
	 * @author 付湘辉
	 * Created on:2008-6-10
	 *
	 * 修改原因：
	 * @param houseList 住户住房信息列表
	 * @param customerList 住户信息列表
	 * @roseuid 4828F65F01CD
	 * @return String "true" 表示成功  "false" 表示失败
	 */
	public String addCustomer(List<CustomerHouseVO> houseList, List<CustomerVO> customerList);

	/**
	 *
	 * 功能描述: 修改一个住户（包括业主和租户），在业务上，一个业主可以有多个住房，<br>
	 * 因此修改动作包括添加其住房信息和自身详细资料，对租户来说亦是如此，<br>
	 * 而一个业主或租户可以是一个个人或组织，组织类型的业主(租户)包含有一些个人信息，<br>
	 * 法人和委托人，在修改住户时，可能同时修改这些信息及它们的关系信息。<br>
	 * 注意：此方法应被其子类重写以实现不同业务逻辑
	 *
	 * @author 付湘辉
	 * Created on:2008-10-21
	 *
	 * 修改原因：
	 * @param houseList 住户住房信息列表
	 * @param customerList 住户信息列表
	 * @return String "true" 表示成功  "false" 表示失败
	 */
	public String editCustomer(List<CustomerHouseVO> houseList, List<CustomerVO> customerList);

	/**
	 * @roseuid 4828F66E0299
	 */
	public void addOrganizationCustomer();

	/**
	 *
	 * 功能描述: 根据一个兴趣爱好id的拼装字符串，<br>
	 * 得到这些id所对应兴趣爱好的名称，将这些名称用逗号分隔符组装。
	 *
	 * @author 付湘辉
	 * Created on:2008-6-17
	 *
	 * 修改原因：
	 * @param interestIdString id的拼装字符串，以逗号分隔
	 * @return String 名称字符串
	 */
	public String assemblyInterestNameString(final String interestIdString);

	/**
	 * @param moveIn
	 * @roseuid 4831302601C5
	 */
	public void customerLiveIn(MoveVO moveIn);

	/**
	 * @param customerMemberVO
	 * @roseuid 4831308E0186
	 */
	public void customerMoveOut(MoveVO moveOut);

	/**
	 * Function:删除业主
	 * @param
	 * @return
	 * Create author:xuhaidui
	 * Create on:2008-6-13
	 * Edit author:
	 * Edit on:
	 * Why:
	 */
	public String deleteOwnerCustomer(Long participantId,String participantTypeCode);

	/**
	 * Function:删除住户
	 * @param
	 * @return
	 * Create author:xuhaidui
	 * Create on:2008-6-13
	 * Edit author:
	 * Edit on:
	 * Why:
	 */
	@Deprecated
	public String deleteCustomer(Long participantId,String participantTypeCode,String customerTypeCode);

	/**
	 * Function:删除租户
	 * @param
	 * @return
	 * Create author:xuhaidui
	 * Create on:2008-6-13
	 * Edit author:
	 * Edit on:
	 * Why:
	 */
	public String deleteLesseeCustomer(Long participantId,String participantTypeCode);

	/**
	 *
	 * 功能描述: 根据房号查出基产权号和合同号，用一个CustomerHouseVO对象封装。
	 *
	 * @author 付湘辉
	 * Created on:2008-6-20
	 *
	 * 修改原因：
	 * @param houseNumber
	 * @return CustomerHouseVO 一个VO
	 */
	public CustomerHouseVO findCustomerHouseByHouseNumber(String houseNumber);

	/**
	 * 功能描述: 根据参与人ID查询个人资料 <br>
	 * @param participantId
	 * @return
	 *
	 * Create author:付湘辉 <br>
	 * Create on:2008-5-29  <br>
	 * Edit author:  <br>
	 * Edit on:    <br>
	 * Why:     <br>
	 */
	public IndividualVO findIndividualById(Long participantId);

	/**
	 * 功能描述: 根据参与人ID查询企业资料 <br>
	 * @param participantId
	 * @return
	 *
	 * Create author:付湘辉 <br>
	 * Create on:2008-5-29  <br>
	 * Edit author:  <br>
	 * Edit on:    <br>
	 * Why:     <br>
	 */
	public OrganizationVO findOrganizationById(Long participantId);

	/**
	 * 功能描述: 根据企业名称查询企业资料，如果没有查到，返回一个空值 <br>
	 * @param participantName
	 * @return
	 *
	 * Create author:付湘辉 <br>
	 * Create on:2008-7-30  <br>
	 * Edit author:  <br>
	 * Edit on:    <br>
	 * Why:     <br>
	 */
	public OrganizationVO findOrganizationByName(String participantName);

	/**
	 *
	 * 功能描述: 得到所有兴趣爱好VO的列表
	 *
	 * @author 付湘辉
	 * Created on:2008-5-30
	 *
	 * 修改原因：
	 * @return List<InterestVO> 兴趣爱好VO的列表
	 */
	public List<InterestVO> getAllInterestList();

	/**
	 * Function: 根据参与人ID找到其房屋关系
	 * @param participantId
	 * @return
	 * Create author:ydw
	 * Create on:2008-6-12
	 * Edit author:
	 * Edit on:
	 * Why:
	 */
	public List<CustomerHouseVO> getClientRHouseBy(Long participantId,String clientType);

	/**
	 * 功能描述: 通过参与人id得到其所有产权房屋信息VO对象列表。
     * 对于一个属于产权共有管理房的产权房来说，对应的VO对象的
     * proRightShareHouseIds属性将被赋值。 <br>
	 * @param participantId
	 * @param clientType
	 * @return List<CustomerHouseVO> 房屋信息VO对象列表
	 *
	 * Create author:付湘辉 <br>
	 * Create on:2008-6-11  <br>
	 * Edit author: 2008-10-23  <br>
	 * Edit on:付湘辉    <br>
	 * Why:  修改注释   <br>
	 */
	public List<CustomerHouseVO> getCustomerHouseListById(Long participantId,SysrefcodeDO clientType);

	/**
	 * 功能描述: 通过参与人id得到其所有产权房屋信息VO对象列表。
     * 对于一个属于产权共有管理房的产权房来说，对应的VO对象的
     * proRightShareHouseIds属性将被赋值。 <br>
	 * @param participantId 参与人id
	 * @param clientType 客户类型code
	 * @return List<CustomerHouseVO> 房屋信息VO对象列表
	 *
	 * Create author:付湘辉 <br>
	 * Create on:2008-6-11  <br>
	 * Edit author: 2008-10-23  <br>
	 * Edit on:付湘辉    <br>
	 * Why:  修改注释   <br>
	 */
	public List<CustomerHouseVO> getCustomerHouseListById(Long participantId,String clientType);

	/**
	 * 功能描述: 通过产权房号获得的该房间的管理房及其相关的产权房 <br>
	 * @param houseNumber 房号
	 * @return List<CustomerHouseVO> 住房信息列表
	 *
	 * Create author:付湘辉 <br>
	 * Create on:2008-5-25  <br>
	 * Edit author:  <br>
	 * Edit on:    <br>
	 * Why:     <br>
	 */
	public List<CustomerHouseVO> getCustomerHouseList(String houseNumber);

	/**
	 * 功能描述: 根据房号查询住户房屋信息列表 <br>
	 * @param houseNumber
	 * @return
	 *
	 * Create author: <br>
	 * Create on:  <br>
	 * Edit author: 付湘辉 <br>
	 * Edit on: 2008-10-23   <br>
	 * Why:  加注释   <br>
	 */
	public List<CustomerHouseVO> getHouseAndCustomerBy(String houseNumber);

	/**
	 * Function:根据房间号获得房间的id及房号
	 * @param
	 * @return
	 * Create author:xuhaidui
	 * Create on:2008-6-10
	 * Edit author:
	 * Edit on:
	 * Why:
	 */
	public HouseVO getHouseByHouseNumber(String houseNumber);

	/**
	 * Function:<p>根据企业名称查询企业信息，法人信息，代理人信息，返回包括三个VO的对象数组</p>
	 * 			<p>数组的值为　1.企业 2.法人 3.代理人
	 * @param participantName
	 * @return
	 * Create author:罗军林
	 * Create on:2008-6-20
	 * Edit author:
	 * Edit on:
	 * Why:
	 */
	public Object[] queryAllOrganization(String participantName);

	/**
	 * @param clientId
	 * @param houseId
	 * @return CustomerMemberVO
	 * @roseuid 48312AD70290
	 */
	public MoveVO queryCustomerBy(Long clientId, Long houseId);

	/**
	 * @param IdTypeID
	 * @param IdNumber
	 * @return IndividualDO
	 * @roseuid 482BFC4F004E
	 */
	public IndividualDO queryCustomerByNumber(Long IdTypeID, String IdNumber);

	/**
	 * 功能描述：1.根据查询条件查出相应的业主和租户
	 *      2.如果参与人角色为家庭成员，则只查出相应的业主或租户并放在结果中。
	 *      3.查询结果中包括参与人名称，房号，住户类型，
	 *			个人的证件类型，证件号码（参与人是企业类型的则是法人代表的证件类型，证件号码），联系电话。并包括
	 *			参与人的ID,和房屋的ID
	 *     4.可对住户类型，姓名，房号排序
	 *     5.房号中可以输入管理房号如1-2AB，会查出1-2A和1-2B相关的住户纪录
	 *    　6.住户类型可以有　业主（个人）、业主（企业）、租户（个人）、租户（企业）;
	 * @param vo　封装的条件
	 * @param pageNo　　第几页
	 * @param pageSize　每页行数
	 * @return 对象数组　如下
	 * <p>姓名	房号     住户类型    证件名  证件号       电话     创建时间                  客户ID  客户类型  参与人ID  参与人类型</p>
	 * <p>华生	6-2D	租户(个人)	军人证	5113	0755-5413	2008-06-20 17:04:25.0	215	   002	   10000885	 001	</p>
	 */
	public Page queryCustomerInfo(CustSearchVO vo, Integer pageNo, Integer pageSize);

	/**
	 * Function:根据企业名称查询企业信息。<br>
	 * 			将会查询这两个表：CS_PARTICIPANT,CS_ORGANIZATION<br>
	 * 			业务上决定企业名称数据的唯一性。如果数据不存在或者不止一个或者出现异常都将返回null<br>
	 * @param participantName
	 * @return
	 * Create author:罗军林
	 * Create on:2008-5-30
	 * Edit author:
	 * Edit on:
	 * Why:
	 */
	public OrganizationVO queryOrganizationByName(String participantName);

	/**
	 * Function:根据证件类型ID和证件号码查询参与人信息。<br>
	 * 			将会查询这三个表：CS_PARTICIPANT,CS_INDIVIDUAL,CS_ID_TYPE<br>
	 * 			业务上决定这两个条件决定数据的唯一性。如果数据不存在或者不止一个或者出现异常都将返回null<br>
	 * @param idTypeCode
	 * @param idNO
	 * @return
	 * Create author:罗军林
	 * Create on:2008-5-30
	 * Edit author:
	 * Edit on:
	 * Why:
	 */
	public IndividualVO queryParticipant(String idTypeId,String idNO);

	/**
	 * 功能描述：1.根据查询条件查出相应的业主和租户
	 *      2.如果参与人角色为家庭成员，则只查出相应的业主或租户并放在结果中。
	 *      3.查询结果中包括参与人名称，房号，住户类型，
	 *			个人的证件类型，证件号码（参与人是企业类型的则是法人代表的证件类型，证件号码），联系电话。并包括
	 *			参与人的ID,和房屋的ID
	 *     4.可对住户类型，姓名，房号排序
	 *     5.房号中可以输入管理房号如1-2AB，会查出1-2A和1-2B相关的住户纪录
	 *    　6.住户类型可以有　业主（个人）、业主（企业）、租户（个人）、租户（企业）;
	 * @param vo　封装的条件
	 * @param pageNo　　第几页
	 * @param pageSize　每页行数
	 * @return 对象数组　如下
	 * <p>　　房号　　　　姓名		　入住日期　搬出日期　 住户类型    证件编码 证件名 证件号               电话     参与人ID 房屋ID 客户房屋关系ID　客户ID</p>
	 * <p>　　1-2A　Jone sharped	2008-06-03　null   业主(个人)	    001	  身份证	450302197511081014	null	   9	   4       3           7  </p>
	 */
	public Page queryResidentInfo(CustSearchVO vo,
			Integer pageNo, Integer pageSize);

	/**
	 * 功能描述: 查询指定了id的产权房的所有居住信息， <br>
	 * 如果该产权房属于双拼多拼房或是双拼(多拼)产权共有房，
	 * 那么相关产权房的居住信息同时查出，
	 * 只查询已入住但没有搬出日期的记录。 <br>
	 *
	 * @param vo 搜索条件，只需要houseId
	 * @return
	 *
	 * Create author:付湘辉 <br>
	 * Create on:2008-11-21  <br>
	 * Edit author:  <br>
	 * Edit on:    <br>
	 * Why:     <br>
	 */
	public List<Object[]> queryResidentInfo(CustSearchVO vo);

	/**
	 *
	 * 功能描述: 验证指定id的参与人是不是指定房间的业主或租户或家庭成员，
	 *
	 * @author 付湘辉
	 * Created on:2008-7-2
	 *
	 * 修改原因：
	 * @param participantId
	 * @param customerHouseVOList
	 * @return String 返回结果
	 * <ul>
	 * <li>owner : 已经是这间房的业主</li>
	 * <li>lessee : 已经是这间房的租户</li>
	 * <li>member : 已经是这间房的家庭成员</li>
	 * </ul>
	 */
	public String validateParticipantRoleInSameHouse(Long participantId,CustomerHouseVO customerHouseVO);

	/**
	 *
	 * 功能描述: 查询指定id的参与人和指定房间的关系，
	 * 查询出房间的所有客户列表，与指定的参与人id一一比较，如果相同则说明这个参与人与
	 * 该房间建立了客户关系，不论何种关系。
	 *
	 * @author 付湘辉
	 * Created on:2008-7-2
	 *
	 * 修改原因：
	 * @param participantId
	 * @param customerHouseVOList
	 * @return String 返回结果
	 * <ul>
	 * <li>null : 没有关系</li>
	 * <li>owner : 已经是这间房的业主</li>
	 * <li>lessee : 已经是这间房的租户</li>
	 * <li>member : 已经是这间房的业主的家庭成员</li>
	 * <li>member : 已经是这间房的租户的家庭成员</li>
	 * </ul>
	 */
	public String queryClientTypeByParticipantIdAhouse(Long participantId,CustomerHouseVO customerHouseVO);

	/**
	 * 方法描述: 根据选中户主ID及房屋找到其相应家庭成员
	 *
	 * @author 胡煦 Create on:2008-6-4
	 * @param id：户主ID
	 * @return 返回当前页的查询结果 Edit author: Edit on: 修改原因：
	 */
	public List<MemberVO> findMemberBy(Long id, Long hid);
}
